import copy
#根据路径深拷贝对象
def lhp_deepcopy2(a:dict,path:str,__b):
    __b=copy.copy(__b)
    path_lst=path.split(".")
    for i in range(len(path_lst)-1):a=a[path_lst[i]]
    if isinstance(a,list):
        stack=[[int(path_lst[-1])]]#a的路径
    else:
        stack=[[path_lst[-1]]]#a的路径
    # print("stack:",stack)
    while  len(stack):
        a_path=stack.pop(0)
        temp_a=a
        temp_b=__b
        for i in range(len(a_path)-1):temp_a=temp_a[a_path[i]]
        for i in range(1,len(a_path)):
            
            temp_b=temp_b[a_path[i]]
        last_a_path=a_path[-1]
        if isinstance(temp_a,dict):
            #存在这个key
            if last_a_path in temp_a:
                #判断值是否是字典 是则遍历字典 并且添加进待处理列表中
                if isinstance(temp_b,dict):
                    for key in temp_b:
                        stack.append(a_path+[key])
                #判断值是否是列表 是则遍历列表 并且添加进待处理列表中
                elif isinstance(temp_b,list):
                    for i in range(len(temp_b)):
                        stack.append(a_path+[i])
                #不为列表也不为字典 直接赋值操作
                else:
                    temp_a[last_a_path]=temp_b
            #不存在这个key 直接赋值操作
            else:
                temp_a[last_a_path]=temp_b
        elif isinstance(temp_a,list):
            lenx=len(temp_a)
            #存在这个索引
            if last_a_path<lenx:
                #判断值是否是字典 是则遍历字典 并且添加进待处理列表中
                if isinstance(temp_b,dict):
                    for key in temp_b:
                        stack.append(a_path+[key])
                #判断值是否是列表 是则遍历列表 并且添加进待处理列表中
                elif isinstance(temp_b,list):
                    for i in range(len(temp_b)):
                        stack.append(a_path+[i])
                #不为列表也不为字典 直接赋值操作
                else:
                    temp_a[last_a_path]=temp_b
            
            #不存在这个索引 直接赋值操作
            else:
                temp_a.append(temp_b)


def lhp_delete2(a,path:str):
    if (path==''): return
    path_lst=path.split(".")
    last_idx=len(path_lst)-1
    for i in range(last_idx):
        if isinstance(a,dict):
            a=a[path_lst[i]]
        else:
            a=a[int(path_lst[i])]
    if isinstance(a,dict):
        del a[path_lst[last_idx]]
    elif isinstance(a,list):
        del a[int(path_lst[last_idx])]
if __name__=="__main__":
    a={"a":"b","b":{"1":"333","2":[1,2,3,{"2":33},1]}}
    name="test1:"
    path="a";val="ffff"
    lhp_deepcopy2(a,path,val);print(name,a)
    name="test2:"
    path="b";val={"1":"444","3":[123],"2":[3,3,4,{"3":333}]}
    lhp_deepcopy2(a,path,val);print(name,a)
    name="test3:"
    path="b";val={"1":"444","3":[123],"2":[3,3,4,{"3":3333,"2":"fdsa"}]}
    lhp_deepcopy2(a,path,val);print(name,a)
    name="test4:"
    path="e";val={"1":"444","3":[123],"2":[3,3,4,{"3":3333,"2":"fdsa"}]}
    lhp_deepcopy2(a,path,val);print(name,a)
    name="test5:"
    lhp_delete2(a,"b.2.1");print(name,a)
    name="test6:"
    lhp_delete2(a,"b.2.2.2");print(name,a)
    name="test7:"
    lhp_delete2(a,"b.2.2.3");print(name,a)